/**
 * @desc 函数节流
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param type 1 使用表时间戳，在时间段开始的时候触发 2 使用表定时器，在时间段结束的时候触发
 */
export const throttle = (func, wait = 1000, type = 1) => {
	let previous = 0
	let timeout
	return function() {
		let context = this
		let args = arguments
		if (type === 1) {
			let now = Date.now()

			if (now - previous > wait) {
				func.apply(context, args)
				previous = now
			}
		} else if (type === 2) {
			if (!timeout) {
				timeout = setTimeout(() => {
					timeout = null
					func.apply(context, args)
				}, wait)
			}
		}
	}
}

// 格式化时间
export function parseTime(time, cFormat) {
	if (!time) return 'N/A'
	if (arguments.length === 0) {
		return null
	}
	const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
	let date
	if (typeof time === 'object') {
		date = time
	} else {
		if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
			time = parseInt(time)
		}
		if (typeof time === 'number' && time.toString().length === 10) {
			time = time * 1000
		}
		date = new Date(time)
	}
	const formatObj = {
		y: date.getFullYear(),
		m: date.getMonth() + 1,
		d: date.getDate(),
		h: date.getHours(),
		i: date.getMinutes(),
		s: date.getSeconds(),
		a: date.getDay(),
	}
	const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
		let value = formatObj[key]
		// Note: getDay() returns 0 on Sunday
		if (key === 'a') {
			return ['日', '一', '二', '三', '四', '五', '六'][value]
		}
		if (result.length > 0 && value < 10) {
			value = '0' + value
		}
		return value || 0
	})
	return time_str
}

/**
 * @description 函数防抖
 * @param {Function} fun 函数
 * @param {Number} delay 延迟执行毫秒数
 */
export function debounce(fun, delay) {
	let timer
	return function(args) {
		const that = this
		clearTimeout(timer)
		timer = setTimeout(function() {
			fun.call(that, args)
		}, delay)
	}
}

// 处理千分位和小数
// 经营简报需要2位小数
// 经营简报0元要处理为0.00
export function makeMoney(val, is2D, changeZero, maxToplus) {
	if (changeZero && !val) {
		return '0.00'
	}
	if (!val) {
		return '0'
	}
	if (isNaN(val)) {
		return val
	}
	if (is2D) {
		val = Number(val).toFixed(2)
	}
	// 小数要另外处理
	const arr = val.toString().split('.')
	if (arr.length > 1) {
		return `${arr[0].toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,')}.${arr[1]}`
	} else {
		if (!maxToplus) {
			return arr[0].toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,')
		} else {
			// 如果超过9999最后加个+号
			if (val > 99999) {
				return '99,999+'
			} else {
				return arr[0].toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,')
			}
		}
	}
}

// 处理空字符串
export function handleStrEmpty(val) {
	return val ? val : 'N/A'
}

// 判断后缀名是否全是大写
export function isUpper(str) {
	var reg = /^[A-Z]+$/
	return reg.test(str)
}

// 判断后缀名是否全是小写
export function isLower(str) {
	var reg = /^[a-z]+$/
	return reg.test(str)
}

// 判断是否为图片格式
export function isImage(str) {
	var reg = /\.(png|jpg|gif|jpeg|webp|PNG|JPG|GIF|JPEG|WEBP)$/
	return reg.test(str)
}

// 下载文件
export function downloadFile(url) {
	uni.downloadFile({
		url, //文件链接
		success: ({
			statusCode,
			tempFilePath
		}) => {
			//statusCode状态为200表示请求成功，tempFIlePath临时路径
			if (statusCode == 200) {
				//保存到本地
				uni.saveFile({
					tempFilePath,
					success: (res) => {
						uni.showToast({
							icon: 'none',
							mask: true,
							title: res.savedFilePath, //保存路径
							duration: 3000,
						})
					},
				})
			}
		},
	})
}

// 处理获取得到的1，0为true,false或者将true,false转为1,0，其他的原样返回
export function filterBoolNum(val) {
	// true false
	if (typeof val === 'boolean') {
		if (val) {
			return 1
		} else {
			return 0
		}
	} else {
		if (Number(val) === 1) {
			return true
		} else if (Number(val) === 0) {
			return false
		} else {
			// 不是数字/不是布尔原样返回
			return val
		}
	}
}
// 格式化部门
export function handleTree(data, id, parentId, children) {
	let config = {
		id: id || 'id',
		parentId: parentId || 'parentId',
		childrenList: children || 'children'
	};

	var childrenListMap = {};
	var nodeIds = {};
	var tree = [];

	for (let d of data) {
		let parentId = d[config.parentId];
		if (childrenListMap[parentId] == null) {
			childrenListMap[parentId] = [];
		}
		nodeIds[d[config.id]] = d;
		childrenListMap[parentId].push(d);
	}

	for (let d of data) {
		let parentId = d[config.parentId];
		if (nodeIds[parentId] == null) {
			tree.push(d);
		}
	}

	for (let t of tree) {
		adaptToChildrenList(t);
	}

	function adaptToChildrenList(o) {
		if (childrenListMap[o[config.id]] !== null) {
			o[config.childrenList] = childrenListMap[o[config.id]];
		}
		if (o[config.childrenList]) {
			for (let c of o[config.childrenList]) {
				adaptToChildrenList(c);
			}
		}
	}
	return tree;
}
// 请求字典的数据
export function dictGet(type) {
	let data = {
		pageNum: 1,
		pageSize: 9999999,
		dictType: type
	}
	return this.$api.workbench.dictA(data)
}
// 返回页面获取实例
export function ReturnToGet(page) {
	let pages = page || 1
	let pageArr = getCurrentPages()
	return pageArr[pageArr.length - pages]
}
//获取时间段的（数组）
export function getDate(number = 8) {
	let reg = /\//ig;;
	var date = new Date();
	var base = new Date(date).getTime();
	var oneDay = 24 * 3600 * 1000;
	var date = [];
	var data = [Math.random() * 300];
	var time = new Date(base);
	date.push([time.getFullYear(), time.getMonth() + 1, time.getDate()].join('/'));
	for (var i = 1; i < number; i++) { //控制需要的天数
		var now = new Date(base -= oneDay); //这里控制往前一周还是往后一周
		date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
		data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
	}
	let newdate = date.reverse(); //往后一周的话需要将数组倒叙，完后不需要
	let dutyStartDate = newdate[0].replace(reg, "-")
	let dutyEndDate = newdate[newdate.length - 2].replace(reg, "-")

	return {
		dutyStartDate,
		dutyEndDate
	}
}

// 获取时间段(以当前时间为基础)
export function dateArea(many) {
	let data = new Date()
	let date = data.toJSON()
	let time = data.getTime()
	// let arr = date.split('/').map(item => {
	// 	if (item.length > 2) return item
	// 	const str = item.length > 1 ? item : ('0' + item)
	// 	return str
	// })
	time = time - (24 * 60 * 60 * 1000 * many)
	let art = new Date(time)
	let datetr = art.toJSON()
	// let arrtr = datetr.split('/').map(item => {
	// 	if (item.length > 2) return item
	// 	const str = item.length > 1 ? item : ('0' + item)
	// 	return str
	// })
	// 今天
	// date = arr.join('-')
	// many天前
	// datetr = arrtr.join('-')
	// return [datetr + ' 00:00:00', date + ' 23:59:59']、
	datetr = datetr.split('T')[0]
	date = date.split('T')[0]
	return [datetr + ' 00:00:00', date + ' 23:59:59']
}
// 请求字典的数据接口
export function dicts (vm,type = 'materia_name'){
	return new Promise((reslve, reject) => {
		vm.$api.dict({
			pageNum: 1,
			pageSize: 999999,
			dictType: type
		}).then(res => {
			reslve(res)
		})
	})
}

export function $numberFormat(value) {
  if (!value && value !== 0) return '';
  // 将数字转为字符串
  let parts = value.toString().split('.');
  // 对小数点前的部分添加千分位逗号
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  // 重新组合整数部分和小数部分
  return parts.join('.');
}